home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / txl / c!!20.lha / C++2.0 / Txl / C++2.0.Grammar < prev   
Text File  |  1992-02-29  |  12KB  |  594 lines

  1. % C++ 2.0 TXL Basis Grammar
  2. % J.R. Cordy, 24 Feb 1992
  3.  
  4. % Loosely adapted from:    
  5. %     Unix System V, AT&T C++ Language System, Release 2.0
  6. %     Appendix A: Grammar Summary
  7. % but with the (as usual) many bugs in the C++ grammar fixed, and the 
  8. % forms tuned for TXL performance.  As noted in the reference above, 
  9. % this grammar is actually a slight superset of C++ 2.0.
  10.  
  11. % Lexical conventions of C++
  12. comments
  13.     //
  14.     /*  */
  15. end comments
  16.  
  17. compounds
  18.     !=  '%=  &&  &=  *=  ++  +=  -+  --  -=  
  19.     ->  ->*  .*  ...  /=  ::  <<  <<=  <=  
  20.     ==  >=  >>  >>=  ^=  |=  ||  **
  21. end compounds
  22.  
  23. keys
  24.     asm auto break case catch char class const
  25.     continue default delete do double else enum extern
  26.     float for friend goto if inline int long
  27.     new operator private protected public register return short
  28.     signed sizeof static struct switch template this typedef
  29.     union unsigned virtual void volatile while
  30. end keys
  31.  
  32. define identifier
  33.         [repeat '_] [id]
  34. end define
  35.  
  36. define string
  37.     [repeat stringlit+]
  38. end define
  39.  
  40. define character_constant
  41.     [charlit]
  42. end define
  43.  
  44. define floating_constant
  45.     [opt '-] [number]
  46. end define
  47.  
  48. define integer_constant
  49.         [opt '-] 0 [SPOFF] [id] [SPON]
  50.     |    [opt '-] [integernumber]
  51. end define
  52.  
  53. % TXL 6.2 explicit spacing controllers - not in TXL 6.0, sorry!
  54. define SPOFF
  55.     [empty]
  56. end define
  57.  
  58. define SPON
  59.     [empty]
  60. end define
  61.  
  62. % Txl grammar goal symbol - a C++ compilation file
  63. define program
  64.     [repeat declaration]
  65. end define
  66.  
  67. % Syntax of C++ 2.0
  68. define expression
  69.     [list assignment_expression+]
  70. end define
  71.  
  72. define assignment_expression
  73.         [conditional_expression]
  74.     |    [unary_expression] [assignment_operator] [assignment_expression]
  75. end define
  76.  
  77. define assignment_operator
  78.     = | *= | /= | '%= | += | -= | >>= | <<= | &= | ^= | '|=
  79. end define
  80.  
  81. define conditional_expression
  82.     [binary_expression] [opt conditional_operation]
  83. end define
  84.  
  85. define conditional_operation
  86.     ? [expression]  :  [conditional_expression]
  87. end define
  88.  
  89. define binary_expression
  90.     [cast_expression] [repeat binary_operation]
  91. end define
  92.  
  93. define binary_operation
  94.     [binary_operator] [cast_expression]
  95. end define
  96.  
  97. define binary_operator
  98.     '|| | && | '| | ^ | & | == | != | < | > | <= | >=  
  99.    |     << | >> | + | - | * | / | '% | .* | ->*  
  100. end define
  101.  
  102. define cast_expression
  103.     [unary_expression]
  104.     |    (  [type_name]  )  [cast_expression]
  105. end define
  106.  
  107. define unary_expression
  108.     [postfix_expression]
  109.     |    ++  [unary_expression]
  110.     |    --  [unary_expression]
  111.     |    [unary_operator]  [cast_expression]
  112.     |    'sizeof  [unary_expression]
  113.     |    'sizeof  (  [type_name]  )
  114.     |    [allocation_expression]
  115.     |    [deallocation_expression]
  116. end define
  117.  
  118. define unary_operator
  119.     * | & | + | - | ! | ~
  120. end define
  121.  
  122. define allocation_expression
  123.     [opt '::] 'new [opt placement] [restricted_type_name] [opt initializer] 
  124. end define
  125.  
  126. define placement
  127.     (  [expression_list]  )
  128. end define
  129.  
  130. define restricted_type_name
  131.     [type_specifiers] [opt restricted_declarator]
  132.     |    ( [type_name] )
  133. end define
  134.  
  135. define restricted_declarator
  136.     [ptr_operator] [opt restricted_declarator]
  137.     |    [restricted_declarator]  '[  [opt expression]  ']
  138. end define
  139.  
  140. define deallocation_expression
  141.     [opt '::]  'delete [cast_expression]
  142.     |    [opt '::]  'delete  '[  [expression]  ']  [cast_expression]
  143. end define
  144.  
  145. define postfix_expression
  146.     [primary_expression] [repeat postfix_extension]
  147.     |    [simple_type_name]  (  [opt expression_list]  ) [repeat postfix_extension]
  148. end define
  149.  
  150. define postfix_extension
  151.         '[  [expression]  ']
  152.     |    (  [opt expression_list]  )
  153.     |    .  [name]
  154.     |    ->  [name]
  155.     |    ++
  156.     |    --
  157. end define
  158.  
  159. define expression_list
  160.     [list assignment_expression+]
  161. end define
  162.  
  163. define primary_expression
  164.     [literal]
  165.     |    'this
  166.     |    ::  [identifier]
  167.     |    ::  [operator_function_name]
  168.     |    (  [expression]  )
  169.     |    [name]
  170. end define
  171.  
  172. define name
  173.     [identifier] 
  174.     |    [qualified_name]    
  175.     |    [operator_function_name]
  176.     |    [conversion_function_name]
  177. end define
  178.  
  179. define qualified_name
  180.     [identifier]  ::  [class_component]
  181. end define
  182.  
  183. define class_component
  184.         [opt '~] [identifier]        
  185.     |    [operator_function_name]
  186.     |    [conversion_function_name]
  187. end define
  188.  
  189. define literal
  190.     [integer_constant]
  191.     |    [character_constant]
  192.     |    [floating_constant]
  193.     |    [string]
  194. end define
  195.  
  196. define declaration
  197.         [linkage_specification]
  198.     |    [class_definition]
  199.     |    [opt decl_specifiers] [opt declarator_list] ;    [NL]
  200.     |    [fct_definition] 
  201.     |    [asm_declaration]
  202.     |    [preprocessor]        [NL]
  203. end define
  204.  
  205. define class_definition
  206.         [NL] [repeat sc_specifier] [class_specifier] 
  207.         [opt declarator_list] ;            [NL] [NL]
  208. end define
  209.  
  210. define asm_declaration
  211.     'asm ( [string] ) ;    [NL]
  212. end define
  213.  
  214. define decl_specifier
  215.     [sc_specifier]
  216.     |    [type_specifier]
  217.     |    [fct_specifier]
  218.     |    'friend
  219.     |    'typedef
  220. %   |    [template_specifier]    % experimental, undefined
  221. end define
  222.  
  223. define decl_specifiers
  224.     [repeat decl_specifier+]
  225. end define
  226.  
  227. define sc_specifier
  228.     'auto
  229.     |    'register
  230.     |    'static
  231.     |    'extern
  232. end define
  233.  
  234. define fct_specifier
  235.     'inline
  236.     |    'virtual
  237. end define
  238.  
  239. define type_specifier
  240.     [simple_type_name]
  241.     |    [class_specifier]
  242.     |    [enum_specifier]
  243.     |    [elaborated_type_specifier]
  244.     |    'const
  245.     |    'volatile
  246. end define
  247.  
  248. define type_specifiers
  249.     [repeat type_specifier+]
  250. end define
  251.  
  252. define simple_type_name
  253.         [identifier]
  254.     |    'char | 'short | 'int | 'long | 'signed | 'unsigned 
  255.     |    'float | 'double | 'void
  256. end define
  257.  
  258. define elaborated_type_specifier
  259.     [class_key] [identifier]
  260.     |    'enum [identifier]
  261. end define
  262.  
  263. define class_key
  264.     'class | 'struct | 'union
  265. end define
  266.  
  267. define enum_specifier
  268.     'enum [opt identifier]  {  [opt enum_list]  }
  269. end define
  270.  
  271. define enum_list
  272.     [list enumerator+]
  273. end define
  274.  
  275. define enumerator
  276.     [identifier] [opt equal_constant_expression]
  277. end define
  278.  
  279. define equal_constant_expression
  280.     =  [constant_expression]
  281. end define
  282.  
  283. define constant_expression
  284.     [conditional_expression]
  285. end define
  286.  
  287. define linkage_specification
  288.     [NL] 'extern [string] {     [NL] [IN]
  289.         [declaration_list]         [EX]
  290.     } [opt ';]             [NL] [NL]
  291.     |    'extern [string]  [declaration]
  292. end define
  293.  
  294. define declaration_list
  295.     [repeat declaration] 
  296. end define
  297.  
  298. define declarator_list
  299.     [list init_declarator+]
  300. end define
  301.  
  302. define init_declarator
  303.     [declarator] [opt initializer]
  304. end define
  305.  
  306. define declarator
  307.         [repeat ptr_operator] [dname] [repeat declarator_extension]
  308.     |    (  [declarator]  ) [repeat declarator_extension]
  309. end define
  310.  
  311. define declarator_extension
  312.         (  [argument_declaration_list]  )  [opt cv_qualifier_list]
  313.     |    '[  [opt constant_expression]  ']
  314. end define
  315.  
  316. define ptr_operator
  317.     [stars]  [opt cv_qualifier_list]
  318.     |    &  [opt cv_qualifier_list]
  319.     |    [identifier]  :: [stars]  [opt cv_qualifier_list]
  320. end define
  321.  
  322. define stars
  323.     * | **
  324. end define
  325.  
  326. define cv_qualifier_list
  327.     [repeat cv_qualifier+]
  328. end define
  329.  
  330. define cv_qualifier
  331.     'const
  332.     |    'volatile
  333. end define
  334.  
  335. define dname
  336.     [name]
  337.     |    ~ [identifier]
  338. end define
  339.  
  340. define type_name
  341.     [type_specifiers] [opt abstract_declarator]
  342. end define
  343.  
  344. define abstract_declarator
  345.     [ptr_operator] [repeat abstract_extension]
  346.     |    (  [abstract_declarator]  ) [repeat abstract_extension]
  347. end define
  348.  
  349. define abstract_extension
  350.         (  [argument_declaration_list]  )  [opt cv_qualifier_list]
  351.     |    '[  [opt constant_expression]  ']
  352.     |    [ptr_operator]
  353.     |    (  [abstract_declarator]  )
  354. end define
  355.  
  356. define argument_declaration_list
  357.         [opt arg_declaration_list]  [opt comma_dotdotdot]
  358. end define
  359.  
  360. define comma_dotdotdot
  361.     [opt ',] '...
  362. end define
  363.  
  364. define arg_declaration_list
  365.     [list argument_declaration+]
  366. end define
  367.  
  368. define argument_declaration
  369.     [decl_specifiers] [declarator] [opt equal_expression]
  370.     |    [decl_specifiers] [opt abstract_declarator] [opt equal_expression]
  371. end define
  372.  
  373. define equal_expression
  374.     =  [expression]
  375. end define
  376.  
  377. define fct_definition
  378.     [NL]
  379.     [opt decl_specifiers] [declarator] [opt ctor_initializer] [fct_body]
  380. end define
  381.  
  382. define fct_body
  383.     [NL] [compound_statement] [opt ';] [NL]
  384. end define
  385.  
  386. define initializer
  387.     = [expression]
  388.     |   = { [IN] [list expression] [EX] }
  389.     |    = { [IN] [initializer_list] [opt ',] [EX] [NL] }
  390.     |    ( [expression_list] )
  391. end define
  392.  
  393. define initializer_list
  394.     [list initializer_element+]
  395. end define
  396.  
  397. define initializer_element
  398.     [expression]
  399.     |    [NL] { [IN] [initializer_list] [opt ',] [EX] }
  400. end define
  401.  
  402. define class_specifier
  403.     [class_head] {            [NL] [IN]
  404.         [repeat member_list]      [EX]
  405.     }
  406. end define
  407.  
  408. define class_head
  409.     [class_key] [opt identifier] [opt base_spec]
  410. end define
  411.  
  412. define member_list
  413.         [EX] [repeat access_specifier_colon] [IN]
  414.         [repeat member_declaration] 
  415. end define
  416.  
  417. define access_specifier_colon
  418.     [access_specifier]  :    [NL]
  419. end define
  420.  
  421. define member_declaration
  422.     [opt decl_specifiers] [opt member_declarator_list] ;    [NL]
  423.     |    [fct_definition]  
  424.     |    [qualified_name] ;    [NL]
  425.     |    [preprocessor]        [NL]
  426. end define
  427.  
  428. define member_declarator_list
  429.     [list member_declarator+]
  430. end define
  431.  
  432. define member_declarator
  433.     [declarator] [opt pure_specifier]
  434.     |    [opt identifier]  :  [constant_expression]
  435. end define
  436.  
  437. define pure_specifier
  438.     =  0
  439. end define
  440.  
  441. define base_spec
  442.     :  [base_list]
  443. end define
  444.  
  445. define base_list
  446.     [list base_specifier+]
  447. end define
  448.  
  449. define base_specifier
  450.     [identifier]
  451.     |    'virtual [opt access_specifier] [identifier]
  452.     |    [access_specifier] [opt 'virtual] [identifier]
  453. end define
  454.  
  455. define access_specifier
  456.     'private
  457.     |    'protected
  458.     |    'public
  459. end define
  460.  
  461. define conversion_function_name
  462.     'operator [conversion_type_name]
  463. end define
  464.  
  465. define conversion_type_name
  466.     [type_specifiers] [opt ptr_operator]
  467. end define
  468.  
  469. define ctor_initializer
  470.     :  [mem_initializer_list]
  471. end define
  472.  
  473. define mem_initializer_list
  474.     [list mem_initializer+]
  475. end define
  476.  
  477. define mem_initializer
  478.     [identifier]  (  [opt expression_list]  )
  479. end define
  480.  
  481. define operator_function_name
  482.     'operator [operator]
  483. end define
  484.  
  485. define operator
  486.     'new | 'delete
  487.     |    + | - | * | / | '% | ^ | & | '| | ~
  488.     |    ! | = | < | > | += | -+ | *= | /= | '%=
  489.     |    ^= | &= | '|= | << | >> | >>= | <<= | == | !=
  490.     |    <= | >= | && | '|| | ++ | -- | , | ->* | ->
  491.     |    () | '[ ']
  492. end define
  493.  
  494. define statement
  495.     [labeled_statement]
  496.     |    [null_statement]
  497.     |    [expression_statement]  
  498.     |    [compound_statement]
  499.     |    [selection_statement]
  500.     |    [iteration_statement]
  501.     |    [jump_statement]
  502.     |    [declaration_statement]
  503. end define
  504.  
  505. define labeled_statement
  506.     [identifier] : [dstatement]
  507.     |    [EX] 'case [constant_expression] :    [NL] [IN]
  508.         [statement]
  509.     |    [EX] 'default :             [NL] [IN]
  510.         [statement]
  511. end define
  512.  
  513. define dstatement
  514.     [statement]
  515.     |    [declaration_statement]
  516. end define
  517.  
  518. define expression_statement
  519.     [expression] ;        [NL]
  520. end define
  521.  
  522. define null_statement
  523.     ;            [NL]
  524. end define
  525.  
  526. define compound_statement
  527.     {                  [NL] [IN]
  528.         [opt statement_list]      [EX]
  529.     }                [NL]
  530. end define
  531.  
  532. define statement_list
  533.     [repeat dstatement+]
  534. end define
  535.  
  536. define selection_statement
  537.         'if ( [expression] ) [statement] [opt else_statement]
  538.     |    'switch  ( [expression] ) [compound_statement]
  539. end define
  540.  
  541. define else_statement
  542.     'else [statement]
  543. end define
  544.  
  545. define iteration_statement
  546.     'while ( [expression] ) [statement]
  547.     |    'do [statement] 'while ( [expression] ) ;    [NL]
  548.     |    'for ( [for_init_statement] [opt expression] ;  [opt expression] ) 
  549.          [for_body]
  550. end define
  551.  
  552. define for_init_statement
  553.     [expression] ;        
  554.     |    [opt decl_specifiers] [opt declarator_list] ;
  555. end define
  556.  
  557. define for_body
  558.     [compound_statement]
  559.     |    [IN] [NL] [statement] [EX]
  560. end define
  561.  
  562. define jump_statement
  563.     'break ;            [NL]
  564.     |    'continue ;            [NL]
  565.     |    'return  [opt expression] ;    [NL]
  566.     |    'goto [identifier] ;        [NL]
  567. end define
  568.  
  569. define declaration_statement
  570.     [declaration]
  571. end define
  572.  
  573. define preprocessor
  574.         [SPOFF] # 'define  [SPON] [identifier]  [expression]
  575.     |    [SPOFF] # 'define  [SPON] [identifier] ( [list identifier+] )  [expression]
  576.     |    [SPOFF] # 'else [SPON]
  577.     |    [SPOFF] # 'endif [SPON]
  578.     |    [SPOFF] # 'if [SPON] [expression]
  579.     |    [SPOFF] # 'ifdef [SPON] [identifier]
  580.     |    [SPOFF] # 'ifndef [SPON] [identifier]
  581.     |    [SPOFF] # 'include [SPON]  [stringlit]
  582.     |    [SPOFF] # 'include [SPON] < [SPOFF] [filename] > [SPON]
  583.     |    [SPOFF] # 'line [SPON] [integernumber] [opt stringlit]
  584.     |    [SPOFF] # 'undef [SPON] [identifier]
  585. end define
  586.  
  587. define filename
  588.     [identifier] [repeat dot_slash_identifier]
  589. end define
  590.  
  591. define dot_slash_identifier
  592.     [opt '.] [opt '/] [identifier]
  593. end define
  594.